package com.yeyks.other.service;


import com.yeyks.common.appcommon.dto.AppAddressCode;
import com.yeyks.common.appcommon.dto.AppAddressDTO;
import com.yeyks.common.appcommon.param.QueryAddressParam;
import com.yeyks.common.appcommon.result.CommonResult;
import com.yeyks.other.dal.domain.AddressDivision;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yeyks.other.model.AddressDivisionDTO;

import java.io.IOException;
import java.util.List;


/**
 * <p>
 * 地址信息表 服务类
 * </p>
 *
 * @author yun
 * @since 2019-06-25
 */
public interface AddressDivisionService extends IService<AddressDivision> {

    /**
     * 根据父类code获取子类的地址信息【为空时， 默认查询所有省】
     * @param divCode 父类的code值
     * @param sourceType cn / yyks
     * @return 返回集合信息
     */
    List<AddressDivisionDTO> getAddressByParentCode(String divCode, String sourceType);

    /**
     * 根据地址的code搜索子地址
     * @param addressParam 输入参数
     * @return 返回结果
     */
    CommonResult<List<AppAddressDTO>> getAddressByCode(QueryAddressParam addressParam);


    /**
     * 根据老数据中的 中文名称 得到 现有的code值
     * @param address
     * @return
     */
    CommonResult<String> getAddressCodeByDetailAddress(String address);

    /**
     * 更新拉取所有地址数据进行更新
     *
     * @return 返回结果
     * @throws IOException
     */
    CommonResult updateOrAddAllAddress() throws IOException;

    /**
     * 循环加入每个市的 其它区
     * 1. 其它区的规则 ： 00 (省) 00(市) 99(区/县)
     * 2. 查询出所有的 市
     * @return 执行成功
     */
    CommonResult updateAllOtherCountry();

    /**
     * 根据主键获取地址信息
     * @param divCode 主键Code
     * @return 返回的对象
     */
    CommonResult<AppAddressDTO> getAddressByDivId(String divCode);

    /**
     * 根据divCode获取area的拼接方式
     * @param divCode 主键Code
     * @return 返回拼接好的数据
     */
    CommonResult<String> getAreaByDivId(String divCode);

    /**
     * 根据divCode获取省市区的code
     * @param divCode 主键code
     * @return 返回结构数据
     */
    CommonResult<AppAddressCode> getAddressCodeByDivId(String divCode);

    /**
     * 根据area地址 或者 divCode 得到 省 市 区/县的code值
     * 规则：
     * 1. 当 address 为null时, 根据divCode进行查询
     * 2. 当 divCode为 null时, 根据address 的area的全称进行查询;
     * @param address area地址
     * @param divCode 主键code
     * @return 返回对象信息
     */
    AppAddressCode getEntityCode(String address, String divCode);
}
